package com.wsestadio.dao.base;

import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;

import com.wsestadio.dao.base.dominio.util.AsientoUtil;
import com.wsestadio.dao.base.dominio.util.exception.AsientoException;
import com.wsestadio.dominio.Asiento;
import com.wsestadio.util.Util;

@SuppressWarnings({"unchecked","unused"})
public class AsientoDAOBase extends DAOBase {

	private static String STR_MENSAJE_SIN_REGISTROS_EXCEPTION = "No hay registro.";
	private static String STR_MENSAJE_ERROR_EXCEPTION = "Error en la la conexion.";
	private static String SQL_ENTIDAD = " Asiento ";
	private static String SQL_QUERY = " select p from "+SQL_ENTIDAD+" p ";
	private static String SQL_WHERE = " where ";
	private static String SQL_SUFIJO_ENTIDAD = " p.";
	private static String SQL_MENOS = " < ";
	private static String SQL_MAS = " > ";
	private static String SQL_QUERY_CONSTRUCTOR_ID = " select new Asiento(p.id) from Asiento p ";

	public AsientoDAOBase(EntityManager em) {
		super(em);
	}

	public List<Asiento> getListaAsientoByActivo(Boolean activo,String campoOrder, String order) throws AsientoException {
		Map<String, Object> map = getNewMap();
		map.put("activo", activo);
		String query = SQL_QUERY + SQL_WHERE+SQL_SUFIJO_ENTIDAD+AsientoUtil.COLUMN_ACTIVO+" = :activo  ";
		if (Util.vacio(campoOrder)) {
			query += " order by " + campoOrder + " " + order;
		}
		query += " ; ";
		try {
			List<Asiento> p = getQuery(query, map);
			if (p != null) {
				return p;
			} else {
				throw new AsientoException(STR_MENSAJE_SIN_REGISTROS_EXCEPTION);
			}
		} catch (Exception e) {
			throw new AsientoException(STR_MENSAJE_ERROR_EXCEPTION);
		}	
	}

	public Integer countAsientoByActivo(Boolean activo) throws Exception {
		String query = SQL_QUERY_CONSTRUCTOR_ID + SQL_WHERE+SQL_SUFIJO_ENTIDAD+AsientoUtil.COLUMN_ACTIVO+" = :activo ; ";
		Map<String, Object> map = getNewMap();
		map.put("activo", activo);
		try {
			Integer p = (Integer) getSingleQuery(query, map);
			return p;
		} catch (Exception e) {
			throw new AsientoException(STR_MENSAJE_ERROR_EXCEPTION);
		}		
	}

	public List<Asiento> getListaAsientoBetweenFechaRegistro(
			Date fechaRegistroInicio, Date fechaRegistroFin, String campoOrder,
			String order) throws Exception {
		Map map = getNewMap();
		map.put("fechaRegistroInicio", fechaRegistroInicio);
		map.put("fechaRegistroFin", fechaRegistroFin);
		String query = " select p from Asiento p  where p.fechaRegistro between :fechaRegistroInicio and fechaRegistroFin  ";
		if ((campoOrder != null) && (!campoOrder.equals(""))
				&& (campoOrder.length() > 0)) {
			query += " order by " + campoOrder + " " + order;
		}
		query += " ; ";
		List<Asiento> p = getQuery(query, map);
		if (p != null) {
			return p;
		} else {
			throw new Exception("No hay regsitros.");
		}
	}

	public Integer countAsientoBetweenFechaRegistro(Date fechaRegistroInicio,
			Date fechaRegistroFin) throws Exception {
		Map map = getNewMap();
		map.put("fechaRegistroInicio", fechaRegistroInicio);
		map.put("fechaRegistroFin", fechaRegistroFin);
		String query = " select count(p) from Asiento p  where p.fechaRegistro between :fechaRegistroInicio and fechaRegistroFin ; ";
		Integer p = (Integer) getSingleQuery(query, map);
		return p;
	}

	public List<Asiento> getListaAsientoBetweenFechaActualizada(
			Date fechaActualizadaInicio, Date fechaActualizadaFin,
			String campoOrder, String order) throws Exception {
		Map map = getNewMap();
		map.put("fechaActualizadaInicio", fechaActualizadaInicio);
		map.put("fechaActualizadaFin", fechaActualizadaFin);
		String query = " select p from Asiento p  where p.fechaActualizada between :fechaActualizadaInicio and fechaActualizadaFin  ";
		if ((campoOrder != null) && (!campoOrder.equals(""))
				&& (campoOrder.length() > 0)) {
			query += " order by " + campoOrder + " " + order;
		}
		query += " ; ";
		List<Asiento> p = getQuery(query, map);
		if (p != null) {
			return p;
		} else {
			throw new Exception("No hay regsitros.");
		}
	}

	public Integer countAsientoBetweenFechaActualizada(
			Date fechaActualizadaInicio, Date fechaActualizadaFin)
			throws Exception {
		Map map = getNewMap();
		map.put("fechaActualizadaInicio", fechaActualizadaInicio);
		map.put("fechaActualizadaFin", fechaActualizadaFin);
		String query = " select count(p) from Asiento p  where p.fechaActualizada between :fechaActualizadaInicio and fechaActualizadaFin ; ";
		Integer p = (Integer) getSingleQuery(query, map);
		return p;
	}

	public List<Asiento> getListaAsientoLikeCodigoUsuario(String codigoUsuario,
			String campoOrder, String order) throws Exception {
		Map map = getNewMap();
		map.put("codigoUsuario", "%" + codigoUsuario + "%");
		String query = " select p from Asiento p  where p.codigoUsuario like :codigoUsuario  ";
		if ((campoOrder != null) && (!campoOrder.equals(""))
				&& (campoOrder.length() > 0)) {
			query += " order by " + campoOrder + " " + order;
		}
		query += " ; ";
		List<Asiento> p = getQuery(query, map);
		if (p != null) {
			return p;
		} else {
			throw new Exception("No hay regsitros.");
		}
	}

	public Integer countAsientoLikeCodigoUsuario(String codigoUsuario)
			throws Exception {
		Map map = getNewMap();
		map.put("codigoUsuario", "%" + codigoUsuario + "%");
		String query = " select count(p) from Asiento p  where p.codigoUsuario like :codigoUsuario ; ";
		Integer p = (Integer) getSingleQuery(query, map);
		return p;
	}

	public List<Asiento> getListaAsientoLikeNumero(String numero,
			String campoOrder, String order) throws Exception {
		Map map = getNewMap();
		map.put("numero", "%" + numero + "%");
		String query = " select p from Asiento p  where p.numero like :numero  ";
		if ((campoOrder != null) && (!campoOrder.equals(""))
				&& (campoOrder.length() > 0)) {
			query += " order by " + campoOrder + " " + order;
		}
		query += " ; ";
		List<Asiento> p = getQuery(query, map);
		if (p != null) {
			return p;
		} else {
			throw new Exception("No hay regsitros.");
		}
	}

	public Integer countAsientoLikeNumero(String numero) throws Exception {
		Map map = getNewMap();
		map.put("numero", "%" + numero + "%");
		String query = " select count(p) from Asiento p  where p.numero like :numero ; ";
		Integer p = (Integer) getSingleQuery(query, map);
		return p;
	}

	public List<Asiento> getListaAsientoByTribuna(Object tribuna,
			String campoOrder, String order) throws Exception {
		Map map = getNewMap();
		map.put("tribuna", tribuna);
		String query = " select p from Asiento p  where p.tribuna = :tribuna  ";
		if ((campoOrder != null) && (!campoOrder.equals(""))
				&& (campoOrder.length() > 0)) {
			query += " order by " + campoOrder + " " + order;
		}
		query += " ; ";
		List<Asiento> p = getQuery(query, map);
		if (p != null) {
			return p;
		} else {
			throw new Exception("No hay regsitros.");
		}
	}

	public Integer countAsientoByTribuna(Object tribuna) throws Exception {
		Map map = getNewMap();
		map.put("tribuna", tribuna);
		String query = " select count(p) from Asiento p  where p.tribuna = :tribuna ; ";
		Integer p = (Integer) getSingleQuery(query, map);
		return p;
	}

	public List<Asiento> getListaAsientoLikeStrTribuna(String strTribuna,
			String campoOrder, String order) throws Exception {
		Map map = getNewMap();
		map.put("strTribuna", "%" + strTribuna + "%");
		String query = " select p from Asiento p  where p.strTribuna like :strTribuna  ";
		if ((campoOrder != null) && (!campoOrder.equals(""))
				&& (campoOrder.length() > 0)) {
			query += " order by " + campoOrder + " " + order;
		}
		query += " ; ";
		List<Asiento> p = getQuery(query, map);
		if (p != null) {
			return p;
		} else {
			throw new Exception("No hay regsitros.");
		}
	}

	public Integer countAsientoLikeStrTribuna(String strTribuna)
			throws Exception {
		Map map = getNewMap();
		map.put("strTribuna", "%" + strTribuna + "%");
		String query = " select count(p) from Asiento p  where p.strTribuna like :strTribuna ; ";
		Integer p = (Integer) getSingleQuery(query, map);
		return p;
	}

	public List<Asiento> getListaAsientoByEstadio(Object estadio,
			String campoOrder, String order) throws Exception {
		Map map = getNewMap();
		map.put("estadio", estadio);
		String query = " select p from Asiento p  where p.estadio = :estadio  ";
		if ((campoOrder != null) && (!campoOrder.equals(""))
				&& (campoOrder.length() > 0)) {
			query += " order by " + campoOrder + " " + order;
		}
		query += " ; ";
		List<Asiento> p = getQuery(query, map);
		if (p != null) {
			return p;
		} else {
			throw new Exception("No hay regsitros.");
		}
	}

	public Integer countAsientoByEstadio(Object estadio) throws Exception {
		Map map = getNewMap();
		map.put("estadio", estadio);
		String query = " select count(p) from Asiento p  where p.estadio = :estadio ; ";
		Integer p = (Integer) getSingleQuery(query, map);
		return p;
	}
}